package xgb
import(
	"fmt"
	"time"
)







/*
.type ErrT:
*/
type ErrT struct{
	Val uint32
	Typ byte
}//ErrT



/*
..method Error:
*/
func(err *ErrT)Error()(ret string){
	switch err.Typ{
	case ERR_RQST:
		ret="ERR_RQST"
	case ERR_VAL:
		ret=fmt.Sprintf("ERR_VAL\nBadValue: %v", err.Val)
	case ERR_WND:
		ret=fmt.Sprintf("ERR_WND\nBadWindowId: %v", err.Val)
	case ERR_PIXMAP:
		ret=fmt.Sprintf("ERR_PIXMAP\nBadPixmapId: %v", err.Val)
	case ERR_ATM:
		ret=fmt.Sprintf("ERR_ATM\nBadAtom: %v", err.Val)
	case ERR_CURSOR:
		ret=fmt.Sprintf("ERR_CURSOR\nBadCursorId: %v", err.Val)
	case ERR_FONT:
		ret=fmt.Sprintf("ERR_FONT\nBadFontId: %v", err.Val)
	case ERR_MATCH:
		ret="ERR_MATCH"
	case ERR_DRAWABLE:
		ret=fmt.Sprintf("ERR_DRAWABLE\nBadDrawableId: %v", err.Val)
	case ERR_ACCESS:
		ret="ERR_ACCESS"
	case ERR_ALLOC:
		ret="ERR_ALLOC"
	case ERR_COLORMAP:
		ret=fmt.Sprintf("ERR_COLORMAP\nBadColomapId: %v", err.Val)
	case ERR_GC:
		ret=fmt.Sprintf("ERR_GC\nBadGContextId: %v", err.Val)
	case ERR_ID:
		ret=fmt.Sprintf("ERR_ID\nInvalideId: %v", err.Val)
	case ERR_NAME:
		ret="ERR_NAME"
	case ERR_LEN:
		ret="ERR_LEN"
	case ERR_IMPLEMENT:
		ret="ERR_IMPLEMENT"
	default:
		ret=fmt.Sprintf("Undefined Err.\nError Code: %v", err.Typ)
	}//switch
	return
}//Error






/*
.type ErrCookT:
*/
type ErrCookT struct{
	sqc uint16
	pip *PipT
	Err *ErrT
}//ErrCookT





/*
..method Wait:
*/
func(errCook *ErrCookT)Wait()bool{
//无响应的请求发生错误时返回错误，成功时不返回任何内容，所以要通过其它方式判断是否成功：
	//如Err成员为nil且X服务器处理的最新请求序列号不大于错误对应的请求的序列号，即错误对应请求还未处理完，则继续等待
	//此处有个特殊情况是当序列号重置时的判断，太复杂这里就不讲了
	for errCook.Err==nil&&((errCook.sqc>=errCook.pip.rtSqc&&errCook.sqc-errCook.pip.rtSqc<0xffff-errCook.sqc+errCook.pip.rtSqc)||(errCook.sqc<errCook.pip.rtSqc&&errCook.pip.rtSqc-errCook.sqc>0xffff-errCook.pip.rtSqc+errCook.sqc)){ time.Sleep(1000) }//for

	//如确定错误对应请求已处理完，则判断是否返回了错误。
	if errCook.Err==nil{return true}//否则返回true
	return false//是则返回false
}//Wait







/*
.type RplQueT:
*/
type RplQueT struct{
	data []byte
	req byte
	rplP any
}//RplQueT





/*
.type GetWndAttrRplT:
*/
type GetWndAttrRplT struct{
	MapState MapStateT
	Visual uint32
	Class WndClsT
	Colormap uint32
	NoPropagateEventMask EvtMskT //禁用事件传播的事件；事件传播类似网页脚本中的“冒泡”，发生在子窗口的事件如果子窗口没注册则会传播给父窗口
	AllEventMask EvtMskT  //所有用户为窗口注册的事件；只要拥有窗口ID，就可以给窗口注册事件，不一定要是创建窗口的用户
	MyEventMask EvtMskT //当前用户为窗口注册的事件
	BackStore BackStoreT//当窗口被遮盖时，保留数据
	SaveUnder bool//当窗口遮盖其它窗口时，保留被遮盖窗口数据
	BackPlane PixMskT//BackStore和SaveUnder保留像素bits的掩码
	BackPixel PixMskT//BackPlane未指定的bits用本像素值OR补全
	BitGravity BitGravT//当窗口尺寸改变时，其背景图像在窗口中的锚定点
	WinGravity WndGravT//当父窗口尺寸改变时，窗口在父窗口中的锚定点
	OverrideRedirect bool //默认情况下创建一个窗口时X Server会自动为新窗口创建一个父窗口(边框)和爷爷窗口(标题栏)；本选项为true时只会创建窗口用户区
	MapIsInstalled bool//???窗口是否安装了Colormap????
}//GetWndAttrRplT




/*
.type GetWndAttrCookT:
*/
type GetWndAttrCookT struct{
	Rpl *GetWndAttrRplT
	Err *ErrT
}//GetWndAttrCookT




/*
..method Wait:
*/
func(cook *GetWndAttrCookT)Wait()bool{
//有响应请求成功返回响应，发生错误时返回错误
	for{
		if cook.Rpl!=nil{return true}//如返回了响应则返回true
		if cook.Err!=nil{return false}//如返回了错误则返回false
		time.Sleep(1000)//如响应和错误都未返回则继续等待
	}//for
}//Wait









/*
.type :
*/